#include <iostream>
#include <string>
#include <fstream>

// #include "bundle.h" //前提: 当前路径下存在bundle.h文件
// g++ bundleCompress.cc bundle.cpp -o bundleCom -lpthread -std=c++11

#include "../server/mylib/include/bundle.h" //使用自己包装的库
// g++ bundleCompress.cc -I ../mylib/include/ -L ../mylib/lib/ -l bundle -o bundleCom -lpthread -std=c++11

//./bundleCom bundle.cpp  bundle.cpp.lz
void usage()
{
    std::cout << "./file.exe 原始文件A 压缩文件B == want A to B" << std::endl;
}
int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        usage();
        return -1;
    }
    std::string originalFile = argv[1];
    std::string zipFile = argv[2];

    // 1.获取原始文件大小fsize
    std::ifstream ifs;
    ifs.open(originalFile, std::ios::binary); // 二进制形式打开原始文件
    ifs.seekg(0, std::ios::end);              // 文件指针从文件首移动到文件尾
    // std::streampos std::istream::tellg()
    size_t fsize = ifs.tellg();  // 获取当前指针距文件首的偏移量
    ifs.seekg(0, std::ios::beg); // 恢复文件指针到文件首

    // 2.将原始文件内容存入body 二进制 ==> string
    std::string body;
    body.resize(fsize);
    // 从输入流 ifs 中读取 fsize 字节的数据到字符数组 body
    // istream &read(char *s, streamsize n)
    ifs.read(&body[0], fsize);

    // 3.压缩文件 压缩后的数据存入packed; body::string ==> packed::string.zip
    std::string packed = bundle::pack(bundle::LZIP, body);

    // 4. 打开用户指定的压缩文件名 将上述压缩后的数据存入该文件
    //  packed::string.zip ==> 二进制-zipFile
    std::ofstream ofs;
    ofs.open(zipFile, std::ios::binary);
    ofs.write(&packed[0], packed.size());

    ifs.close();
    ofs.close();
    return 0;
}
